package com.ysd.lis.service.sta.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.ysd.common.Result;
import com.ysd.lis.entity.sta.StaFeeItem;
import com.ysd.lis.entity.sta.StaFeeitemVsItemdict;
import com.ysd.lis.entity.sta.StaItemDict;
import com.ysd.lis.mapper.sta.StaFeeItemMapper;
import com.ysd.lis.request.FeeItemPageSysParam;
import com.ysd.lis.service.sta.StaFeeItemService;
import com.ysd.lis.service.sta.StaItemDictService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 申请项目 服务实现类
 * </p>
 *
 * @author wh
 * @since 2025-01-16
 */
@Service
public class StaFeeItemServiceImpl extends ServiceImpl<StaFeeItemMapper, StaFeeItem> implements StaFeeItemService {

    @Autowired
    private StaFeeItemMapper staFeeItemMapper;
    @Autowired
    private StaItemDictService staItemDictService;

    @Override
    public Result findDictByFeeList(FeeItemPageSysParam feeItemPageParam) {
        MPJLambdaWrapper<StaItemDict> lambdaQueryWrapper = new MPJLambdaWrapper<>();
        lambdaQueryWrapper.selectAll(StaItemDict.class);
        lambdaQueryWrapper.selectAs(StaFeeItem::getFeeName, StaItemDict::getFeeName);
        lambdaQueryWrapper.leftJoin(StaFeeitemVsItemdict .class, p -> p.eq(StaFeeitemVsItemdict::getItemNo, StaItemDict::getItemNo));
        lambdaQueryWrapper.leftJoin(StaFeeItem.class, p -> p.eq(StaFeeItem::getFeeCode, StaFeeitemVsItemdict::getFeeCode));
        lambdaQueryWrapper.eq(StrUtil.isNotEmpty(feeItemPageParam.getWorkGroup()),StaFeeItem::getWorkGroup, feeItemPageParam.getWorkGroup());
        lambdaQueryWrapper.eq(StrUtil.isNotEmpty(feeItemPageParam.getOrgId()), StaFeeItem::getOrgId, feeItemPageParam.getOrgId()).eq(StaFeeItem::getDelFlag, 0);
        StringBuffer existsSql = new StringBuffer("SELECT 1 FROM LAB_ITEM_DICT t2 WHERE t2.DEL_FLAG=0 and t.ITEM_NO = t2.ITEM_NO AND t2.RPT_GROUP =  '"+feeItemPageParam.getRptGroup()+"'");
        lambdaQueryWrapper.notExists(existsSql.toString());

        if (StrUtil.isNotEmpty(feeItemPageParam.getKeywords())) {
            lambdaQueryWrapper.and(wrapper -> wrapper.like(StaFeeItem::getFeeCode, feeItemPageParam.getKeywords()).or().like(StaFeeItem::getFeeName, feeItemPageParam.getKeywords()).or().like(StaFeeItem::getInputCode, feeItemPageParam.getKeywords()));
        }
        List<StaItemDict> labFeeItemPage = staItemDictService.list( lambdaQueryWrapper);
        return Result.succ(1, "查询成功", labFeeItemPage);
    }

    @Override
    public Result findLabApplyItemList(FeeItemPageSysParam feeItemPageParam) {
        Integer pageIndex = feeItemPageParam.getPageIndex();
        Integer pageSize = feeItemPageParam.getPageSize();
        Page<StaFeeItem> page = new Page<>();
        page.setCurrent(pageIndex);
        page.setSize(pageSize);
        MPJLambdaWrapper<StaFeeItem> lambdaQueryWrapper = new MPJLambdaWrapper<>();
        lambdaQueryWrapper.selectAll(StaFeeItem.class);
        lambdaQueryWrapper.eq(StrUtil.isNotEmpty(feeItemPageParam.getWorkGroup()),StaFeeItem::getWorkGroup, feeItemPageParam.getWorkGroup());
        lambdaQueryWrapper.eq(StrUtil.isNotEmpty(feeItemPageParam.getOrgId()), StaFeeItem::getOrgId, feeItemPageParam.getOrgId()).eq(StaFeeItem::getDelFlag, 0);
        if (StrUtil.isNotEmpty(feeItemPageParam.getKeywords())) {
            lambdaQueryWrapper.and(wrapper -> wrapper.like(StaFeeItem::getFeeCode, feeItemPageParam.getKeywords()).or().like(StaFeeItem::getFeeName, feeItemPageParam.getKeywords()).or().like(StaFeeItem::getInputCode, feeItemPageParam.getKeywords()));
        }
        Page<StaFeeItem> labFeeItemPage = staFeeItemMapper.selectPage(page, lambdaQueryWrapper);
        return Result.succ(1, "查询成功", labFeeItemPage);
    }

    @Override
    public Result savaOrUpdateFeeItem(StaFeeItem staFeeItem) {
        boolean b = this.saveOrUpdate(staFeeItem);
        if (b) {
            return Result.succ(1, "成功", null);
        } else {
            return Result.fail("失败");
        }
    }

    @Override
    public Result deleteFeeItem(List<StaFeeItem> staFeeItem) {
        List<String> ids = staFeeItem.stream().map(StaFeeItem::getId).filter(StringUtils::isNotBlank).collect(Collectors.toList());

        boolean b = this.removeByIds(ids);
        if (b) {
            return Result.succ(1, "删除成功", null);
        } else {
            return Result.fail("删除失败");
        }
    }
}
